import matplotlib.pyplot as plt
from typing import List
from models import Game

class GameDataVisualizer:
    """游戏数据可视化类"""
    
    @staticmethod
    def plot_price_distribution(games: List[Game], save_path: str = None):
        """
        绘制游戏价格分布图
        
        Args:
            games: 游戏列表
            save_path: 保存路径，如果为None则显示图表
        """
        prices = [game.price for game in games]
        plt.figure(figsize=(10, 6))
        plt.hist(prices, bins=20, edgecolor='black')
        plt.title('游戏价格分布')
        plt.xlabel('价格 (¥)')
        plt.ylabel('游戏数量')
        plt.grid(True, alpha=0.3)
        
        if save_path:
            plt.savefig(save_path)
        else:
            plt.show()
        plt.close()
    
    @staticmethod
    def plot_discount_distribution(games: List[Game], save_path: str = None):
        """
        绘制游戏折扣分布图
        
        Args:
            games: 游戏列表
            save_path: 保存路径，如果为None则显示图表
        """
        discounts = [game.discount for game in games]
        plt.figure(figsize=(10, 6))
        plt.hist(discounts, bins=20, edgecolor='black')
        plt.title('游戏折扣分布')
        plt.xlabel('折扣 (%)')
        plt.ylabel('游戏数量')
        plt.grid(True, alpha=0.3)
        
        if save_path:
            plt.savefig(save_path)
        else:
            plt.show()
        plt.close()
    
    @staticmethod
    def plot_top_games_by_price(games: List[Game], top_n: int = 10, save_path: str = None):
        """
        绘制价格最高的游戏条形图
        
        Args:
            games: 游戏列表
            top_n: 显示前N个游戏
            save_path: 保存路径，如果为None则显示图表
        """
        sorted_games = sorted(games, key=lambda x: x.price, reverse=True)[:top_n]
        names = [game.name for game in sorted_games]
        prices = [game.price for game in sorted_games]
        
        plt.figure(figsize=(12, 6))
        plt.barh(names, prices)
        plt.title(f'价格最高的{top_n}个游戏')
        plt.xlabel('价格 (¥)')
        plt.ylabel('游戏名称')
        plt.grid(True, alpha=0.3)
        
        if save_path:
            plt.savefig(save_path)
        else:
            plt.show()
        plt.close() 